package dados;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.PreparedStatement;
import javax.swing.JOptionPane;

import negocios.Classificacao;
import negocios.Familia;
import negocios.Insumo;
import negocios.Unidade;

public class ConectaBDInsumos {
	
	private Connection conexao;
	
	public ConectaBDInsumos() throws SQLException, ClassNotFoundException {
		
		this.conexao = ConectaBD.getConectacao();
		
	}
	
	public Object[] listarInsumos() {
		
		Object[] ins = null;

        try { /* Não executa dois queries no mesmo bloco. [Procurar o porquê]

            Statement st1 = conexao.createStatement();

            ResultSet rs1 = st1.executeQuery("SELECT COUNT(*) as RESULT" +
                                               "FROM tbinsumo, tbclassificacao," +
                                                     "tbunidade, tbfamilia " +
                                              "WHERE tbinsumo.ICLASSICODI = tbclassificacao.ICLASSICODI AND " +
                                                     "tbinsumo.IUNIDADCODI = tbunidade.IUNIDADCODI AND " +
                                                     "tbinsumo.IFAMPROCODI = tbfamilia.IFAMPROCODI");
            
            
            rs1.next(); 
            
            ins = new Insumo[rs1.getInt("RESULT")];
            
            st1.close();
            
            rs1.close();

            conexao.close(); */

            PreparedStatement pst = conexao.prepareStatement("SELECT tbinsumo.IINSUMOCODI, tbinsumo.VINSUMODESC, tbinsumo.DINSUMOPREC, tbinsumo.VINSUMOPONT, tbinsumo.VINSUMOTIPO, tbinsumo.ICLASSICODI, tbclassificacao.VCLASSIDESC, tbinsumo.IUNIDADCODI, tbunidade.VUNIDADDESC, tbunidade.VUNIDADABRE, tbinsumo.IFAMPROCODI, tbfamilia.VFAMPRODESC, tbfamilia.IFAMPROCOSE FROM tbinsumo, tbclassificacao, tbunidade, tbfamilia " +
                                              "WHERE tbinsumo.ICLASSICODI = tbclassificacao.ICLASSICODI AND " +
                                                    "tbinsumo.IUNIDADCODI = tbunidade.IUNIDADCODI AND " +
                                                    "tbinsumo.IFAMPROCODI = tbfamilia.IFAMPROCODI ORDER BY tbinsumo.IINSUMOCODI");

            ResultSet rs = pst.executeQuery();

            int cont = 0;

            while(rs.next()) cont++;

            ins = new Insumo[cont];

            rs = pst.executeQuery();
                       
            for(cont = 0; cont < ins.length; cont++) {

                rs.next();
                Classificacao cla = new Classificacao(rs.getInt(6), rs.getString(7));
                Unidade und = new Unidade(rs.getInt(8), rs.getString(9), rs.getString(10));
                Familia fam = new Familia(rs.getInt(11), rs.getString(12), rs.getInt(13));
                ins[cont] = new Insumo(rs.getInt(1), rs.getString(2), rs.getBigDecimal(3), rs.getString(4), rs.getString(5), cla, und, fam);

            }

            return ins;

        } catch(SQLException e) {

            JOptionPane.showMessageDialog(null, e.getMessage(), "Erro na execução da consulta", JOptionPane.ERROR_MESSAGE);

        }

		return ins;
		
	}
	
	public Insumo consultarInsumo(Insumo insumo) {
		
		try {

            PreparedStatement pst = conexao.prepareStatement("SELECT tbinsumo.IINSUMOCODI, tbinsumo.VINSUMODESC, tbinsumo.DINSUMOPREC, tbinsumo.VINSUMOPONT, tbinsumo.VINSUMOTIPO, tbinsumo.ICLASSICODI, tbclassificacao.VCLASSIDESC, tbinsumo.IUNIDADCODI, tbunidade.VUNIDADDESC, tbunidade.VUNIDADABRE, tbinsumo.IFAMPROCODI, tbfamilia.VFAMPRODESC, tbfamilia.IFAMPROCOSE " +
                                                               "FROM tbinsumo, tbclassificacao, tbunidade, tbfamilia " +
                                                              "WHERE tbinsumo.ICLASSICODI = tbclassificacao.ICLASSICODI AND " +
                                                                    "tbinsumo.IUNIDADCODI = tbunidade.IUNIDADCODI AND " +
                                                                    "tbinsumo.IFAMPROCODI = tbfamilia.IFAMPROCODI AND " +
                                                                    "tbinsumo.IINSUMOCODI = ?");

            pst.setInt(1, insumo.getCodigo());

            ResultSet rs = pst.executeQuery();



            if(rs.next()) {

                Classificacao cla = new Classificacao(rs.getInt(6), rs.getString(7));
                Unidade und = new Unidade(rs.getInt(8), rs.getString(9), rs.getString(10));
                Familia fam = new Familia(rs.getInt(11), rs.getString(12), rs.getInt(13));
                Insumo ins = new Insumo(rs.getInt(1), rs.getString(2), rs.getBigDecimal(3), rs.getString(4), rs.getString(5), cla, und, fam);

                pst.close();

                rs.close();

                conexao.close();

                return ins;

            }


        } catch(SQLException e) {

            JOptionPane.showMessageDialog(null, e.getMessage(), "Erro na execução da consulta", JOptionPane.ERROR_MESSAGE);

        } catch(NumberFormatException e) {

            JOptionPane.showMessageDialog(null, e.getMessage(), "Erro no formato do número na consulta", JOptionPane.ERROR_MESSAGE);

        }

        return null;
		
	}
	
	public void inserirInsumo(Insumo insumo) {
		
		try {

            PreparedStatement pst = conexao.prepareStatement("INSERT INTO tbinsumo (VINSUMODESC, DINSUMOPREC, VINSUMOPONT, VINSUMOTIPO, ICLASSICODI, IUNIDADCODI, IFAMPROCODI) VALUES (?, ?, ?, ?, ?, ?, ?)");

            pst.setString(1, insumo.getDescricao());
            pst.setBigDecimal(2, insumo.getPreco());
            pst.setString(3, insumo.getPonto());
            pst.setString(4, insumo.getTipo());
            pst.setInt(5, insumo.getClassificacao().getCodigo());
            pst.setInt(6, insumo.getUnidade().getCodigo());
            pst.setInt(7, insumo.getFamilia().getCodigo());
            
            pst.execute();
            pst.close();

            conexao.close();

        } catch(SQLException e) {

            JOptionPane.showMessageDialog(null, e.getMessage(), "Erro na execução da inserção", JOptionPane.ERROR_MESSAGE);

        }
		
	}
	
	public void editarInsumo(Insumo insumo) {
		
		if(this.consultarInsumo(insumo) != null) {

            try {

                this.conexao = ConectaBD.getConectacao();

                PreparedStatement pst = conexao.prepareStatement("UPDATE tbinsumo SET (?, ?, ?, ?, ?, ?, ?) WHERE IINSUMOCODI = ?");

                pst.setString(1, insumo.getDescricao());
                pst.setBigDecimal(2, insumo.getPreco());
                pst.setString(3, insumo.getPonto());
                pst.setString(4, insumo.getTipo());
                pst.setInt(5, insumo.getClassificacao().getCodigo());
                pst.setInt(6, insumo.getUnidade().getCodigo());
                pst.setInt(7, insumo.getFamilia().getCodigo());
                pst.setInt(8, insumo.getCodigo());

                pst.executeUpdate();
                pst.close();

                conexao.close();

            } catch(SQLException e) {

                JOptionPane.showMessageDialog(null, e.getMessage(), "Erro na execução da edição", JOptionPane.ERROR_MESSAGE);

            }

        }
		
	}
	
	public void excluirInsumo(Insumo insumo) {
		
		if(this.consultarInsumo(insumo) != null) {

            try {

                this.conexao = ConectaBD.getConectacao();

                PreparedStatement pst = conexao.prepareStatement("DELETE FROM tbinsumo WHERE IINSUMOCODI = ?");

                pst.setInt(1, insumo.getCodigo());

                pst.executeUpdate();
                pst.close();

                conexao.close();

            } catch(SQLException e) {

                JOptionPane.showMessageDialog(null, e.getMessage(), "Erro na execução da remoção", JOptionPane.ERROR_MESSAGE);

            }

        }
		
	}
	
}
